/**
* @brief    开关设备驱动
* @file     XxxSwitchScan_Driver.h
* @author   何锡斌
* @email    2537274979@qq.com
* @date     2024/01/19
* @version  V1_0_0
* @par      实现功能：
* - 支持多开关设备(按键等)的短按/短按抬起/长按/持续长按/长按抬起/连击/单边沿触发 事件响应；
* - 支持每个设备的按下消抖与抬起消抖的独立配置；
* - 支持每个设备的每个事件响应的独立开启与关闭；
* @par      注意事项：
* - 首次触发的连击事件即为双击，此时`XxxSwitchDevice_ReadComboHitNum()`函数读取到的连击次数返回即为2；
* - 连击一旦没续上则连击次数会被清零，所以在触发连击事件时按需求是否利用或保存连击次数；
* - 边沿模式仅能单边沿触发；
* - 在操作系统中使用时，如果其中一个设备使用到的IPC是阻塞方式，会导致其他设备的扫描被阻塞；
* - tick是由调用者外部决定的，以1~20ms为一次tick均可。tick越小，功耗与cpu占用越高；
* - 消抖时长(计数数值*tick)，一般为10~50ms，由实际抖动程度决定；
* @par      修改日志：
* <table>
* <tr><th>日期          <th>版本        <th>作者    <th>更新内容        </tr>
* <tr><td>2024/01/19    <td>V1_0_0      <td>何锡斌  <td>初版发布；      </tr>
* </table>
*/
#ifndef _XXXSWITCHSCAN_DRIVER_H_
#define _XXXSWITCHSCAN_DRIVER_H_



/********************************************驱动功能裁剪配置********************************************/
#define CFG_XXXSWITCH_COMBOHIT          (0)                 /**< 连击功能裁剪配置选项       1:启用/0:裁剪 */
#define CFG_XXXSWITCH_EDGETRIGGER       (0)                 /**< 边沿触发功能裁剪配置选项   1:启用/0:裁剪 */
/********************************************驱动功能裁剪配置End********************************************/



/**开关设备类型*/
typedef enum{
	SwitchDeviceType_Common = 0,		/**< 普通 */
    #if CFG_XXXSWITCH_COMBOHIT
	SwitchDeviceType_ComboHit,			/**< 附带连击功能 */
    #endif
    #if CFG_XXXSWITCH_EDGETRIGGER
    SwitchDeviceType_EdgeTrigger,		/**< 边沿触发 */
    #endif
}enum_XxxSwitchDeviceType;


/**开关检测响应事件*/
typedef enum{
	SwitchCheckState_Click = 0,			/**< 短按 */
	SwitchCheckState_Click2Up,			/**< 短按抬起 */
	SwitchCheckState_Long,				/**< 长按 */
	SwitchCheckState_Continue,			/**< 持续长按 */
	SwitchCheckState_Long2Up,			/**< 长按抬起 */
    #if CFG_XXXSWITCH_COMBOHIT
	SwitchCheckState_ComboHit,			/**< 连击 */
    #endif
    #if CFG_XXXSWITCH_EDGETRIGGER
	SwitchCheckState_EdgeTrigger,		/**< 有效边沿触发 */
    #endif
}enum_XxxSwitchCheckState;



/**开关设备类*/
typedef struct _STR_XxxSwitchDevice STR_XxxSwitchDevice;



/********************************************函数声明********************************************/
#ifdef __cplusplus
extern "C" {
#endif


/*获取开关设备类的大小(用于申请内存)*/
unsigned char XxxSwitchDevice_GetSize(void);
/**注册(基础版，仅有短按与短按抬起事件)*/
#define XxxSwitchDevice_BaseRegister(pKey, type, trigger, triggerWaitVal, upWaitVal, readInputStateFunc, handleFunc)	\
		XxxSwitchDevice_Register(pKey, type, trigger, triggerWaitVal, upWaitVal, 0, 0, 0, readInputStateFunc, handleFunc)
/*配置长按事件(若关闭，则伴随关闭持续长按与长按抬起事件)*/
int XxxSwitchDevice_CfgEvent_Long(STR_XxxSwitchDevice* pKey, unsigned short longVal);
/*配置持续长按事件*/
int XxxSwitchDevice_CfgEvent_Continue(STR_XxxSwitchDevice* pKey, unsigned short continueVal);
#if CFG_XXXSWITCH_COMBOHIT
/*配置连击事件*/
int XxxSwitchDevice_CfgEvent_ComboHit(STR_XxxSwitchDevice* pKey, unsigned short comboHitInterval);
#endif
/*注册(自定义)*/
int XxxSwitchDevice_Register(STR_XxxSwitchDevice* pKey, enum_XxxSwitchDeviceType type, unsigned char trigger,	\
								unsigned short triggerWaitVal, unsigned short upWaitVal,	\
								unsigned short longVal, unsigned short continueVal,	\
								unsigned short comboHitInterval,    \
								unsigned char (*readInputStateFunc)(void),  \
								void (*handleFunc)(enum_XxxSwitchCheckState state)  \
								);
/*注销(由调用者自己回收内存)*/
int XxxSwitchDevice_Delete(STR_XxxSwitchDevice* pKey);
/*扫描*/
void XxxSwitchDevice_Scan(void);
/*是否触发*/
unsigned char XxxSwitchDevice_IsTrigger(STR_XxxSwitchDevice* pKey);
/*复位*/
void XxxSwitchDevice_Reset(STR_XxxSwitchDevice* pKey);
#if CFG_XXXSWITCH_COMBOHIT
/*读取连击次数*/
unsigned short XxxSwitchDevice_ReadComboHitNum(STR_XxxSwitchDevice* pKey);
#endif


#ifdef __cplusplus
}
#endif
#endif
